package state


 import ."api"


type luaState struct {

	// 由于注册表是全局状态，每个解释器实例都有自己的注册表
	// 所以将它放在luaState结构体里是合理的
	registry	*luaTable		// 注册表

	stack 	*luaStack

	// coroutine 协程
	coStatus	int
	coCaller	*luaState
	coChan 		chan int	// chan 通道关键字
}


// 创建luaState实例
// New函数创建的线程是主线程
func New() *luaState {
	ls := &luaState{}

	// 创建注册表，预先往里面放一个全局环境
	registry := newLuaTable(8, 0)
	registry.put(LUA_RIDX_GLOBALS, newLuaTable(0, 20))	// 全局环境
	registry.put(LUA_RIDX_MAINTHREAD, ls)

	// 往luaState里面推入一个空的Lua栈(调用帧)
	ls.registry = registry
	ls.pushLuaStack(newLuaStack(LUA_MINSTACK, ls))

	return ls
}


// 在栈顶推入一个函数调用栈
func (self *luaState) pushLuaStack(stack *luaStack) {

	stack.prev = self.stack

	self.stack = stack
}


// 从栈顶弹出一个函数调用栈
func (self *luaState) popLuaStack() {

	stack := self.stack

	self.stack = stack.prev

	stack.prev = nil
}


// 是否是主线程
func (self *luaState) isMainThread() bool {
	return self.registry.get(LUA_RIDX_MAINTHREAD) == self
}